#include <random>
#include <string>
#include <sstream>
#include <atomic>
#include <fstream>
#include <iomanip>
#include "logger.h"

std::string uuid()
{
    // 生成一个16位随机字符串作为一个id
    // 生成6个0~255之间的随机数字(1字节-转换为16进制字符)--生成12位16进制字符
    std::random_device rd;                                   // 使用设备随机数生成随机数种子
    std::mt19937 generator(rd());                            // 以设备随机数为种子，实例化伪随机数对象
    std::uniform_int_distribution<int> distribution(0, 255); // 限定随机范围
    std::stringstream ss;                                    // 保存数据
    for (int i = 0; i < 6; ++i)
    {
        if (i == 2)
            ss << "-";
        // 设置宽度为2个字符，不够填充为0，生成16进制
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
    }
    ss << "-";
    static std::atomic<short> idx(0);
    short tmp = idx.fetch_add(1); // 加一
    ss << std::setw(4) << std::setfill('0') << std::hex << tmp;
    return ss.str();
}

bool readFile(const std::string &namefile, std::string &body)
{
    std::ifstream ifs(namefile, std::ios::binary | std::ios::in);
    if (ifs.is_open() == false)
    {
        LOG_ERROR("打开文件 {} 失败！", namefile);
        return false;
    }
    ifs.seekg(0, std::ios::end); // 跳转到文件末尾
    size_t flen = ifs.tellg();   // 获取当前偏移量-- 文件大小
    ifs.seekg(0, std::ios::beg); // 跳转到文件起始
    body.resize(0, flen);
    ifs.read(&body[0], flen);
    if (ifs.good() == false)
    {
        LOG_ERROR("读取文件 {} 数据失败！", namefile);
        ifs.close();
        return false;
    }
    ifs.close();
    return true;
}

bool writeFile(const std::string &namefile, const std::string &body)
{
    // 实现将body中的数据，写入filename对应的文件中
    std::ofstream ofs(namefile, std::ios::out | std::ios::binary | std::ios::trunc);
    if (ofs.is_open() == false)
    {
        LOG_ERROR("打开文件 {} 失败！", namefile);
        return false;
    }
    ofs.write(body.c_str(), body.size());
    if (ofs.good() == false)
    {
        LOG_ERROR("读取文件 {} 数据失败！", namefile);
        ofs.close();
        return false;
    }
    ofs.close();
    return true;
}